package ar.com.fiuba.domain;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeSet;

import ar.com.fiuba.application.impl.FileDataSource;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;


public class DatabaseTest {
	
	public static void main(String[] args) throws Exception
	{
		//Conexion a la base de datos
		Class.forName("com.mysql.jdbc.Driver");
		Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/QueryCorrector","root","");
	
		int longitudNgram = Integer.valueOf(args[1]);
		String palabraACorregir = args[2];
		
		//Si el usuario agrego createDB como parametro se crea la base de datos
		
		if(args[3] != null && args[3].equals("createDB") ){
			
			ArrayList<Word> palabras = new ArrayList<Word>();
			
			//Cargamos las palabras del diccionario, creando un objeto "word" con sus n-gramas para cada una	
			FileDataSource diccionario = new FileDataSource("palabras.lst");
			while(!diccionario.hasDataLeft()){			
				palabras.add(new Word(diccionario.getNextWord(),longitudNgram));
			}
		
			//Cargamos la base de datos con las palabras y los n-gramas de la longitud establecida.
			while(!diccionario.hasDataLeft()){			
				palabras.add(new Word(diccionario.getNextWord(),longitudNgram));
			}
	
			for(Word w:palabras){
				for(Ngramm s:w.getNgramms()){
					Statement st = (Statement) con.createStatement();
					st.execute("insert into palabra values ('"+s.getValue()+"','" + w.getValue() + "')");
				}
			}
		}
				
		//Obtengo de la base de datos, las palabras que tengan n-gramas en común con la palabra que quiero corregir
		//1-Obtengo los  n-gramas de la palabra a corregir
		
		Word wordACorregir = new Word(palabraACorregir, longitudNgram);		
		ArrayList<String> palabrasAEvaluar = new ArrayList<String>();
		TreeSet resultados = new TreeSet(); 
		HashMap resMap = new HashMap();
		CommonCoeficientCalculationWithPositionStrategy coeficiente = new CommonCoeficientCalculationWithPositionStrategy();
		
		//Para cada n-grama, busco las palabras que contengan el mismo n-grama y calculo el coeficiente respecto a mi palabra a corregir,
		//Me quedo con el máximo coeficiente
		for(Ngramm s:wordACorregir.getNgramms()){
			Statement st = (Statement) con.createStatement();
			ResultSet result = st.executeQuery("select palabra from palabra where ngram = '" + s.getValue() +"'");
			while(result.next())
			{
				//System.out.println(result.getString(1));
				Double coef = coeficiente.calculate(new Word(result.getString(1),longitudNgram), palabraACorregir, longitudNgram);
				resultados.add(coef);
				resMap.put(coef, result.getString(1));
			}
		}
		
		System.out.println(resMap.get(resultados.last()));
		
	}
	
	
}
